package com.example.mymessagequeue.common;

import java.io.*;

public class BinaryTool {

    /**
     * 把一个对象序列化成一个字节数组
     * @param object
     * @return
     */
    public static byte[] toBytes(Object object) throws IOException {
        // 这个流对象相当于一个变长的字节数组。
        // 可以将 object 序列化的数据给逐渐写入到 byteArrayOutputStream 中, 在统一转成 byte[]
        try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
            try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)) {
                // 此处的 writeObject 就把这个对象进行序列化, 生成的二进制字节数据, 就会写入到 objectOutputStream 中, 但是由于
                // objectOutputStream 又关联到了 ByteArrayOutputStream, 所以最终结果就写到了 ByteArrayOutputStream 中了。
                objectOutputStream.writeObject(object);
            }
            // 把 byteArrayOutputStream 中持有的二进制数据取出来, 转成 byte[]
            return byteArrayOutputStream.toByteArray();
        }
    }

    /**
     * 把一个字节数组反序列化成一个对象
     * @param data
     * @return
     */
    public static Object fromBytes(byte[] data) throws IOException, ClassNotFoundException {
        Object object = null;
        try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data)) {
            try (ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)) {
                // 此处的 readObject 就是从 data 字节数组读取数据并进行反序列化, 返回结果就是 object 对象
                object = objectInputStream.readObject();
            }
        }
        return object;
    }
}
